package org.lilystudio.veryftp.index;

//import org.lilystudio.veryftp.dao.TempDao;
import org.lilystudio.veryftp.dao.impl.TempDaoImpl;
import org.lilystudio.veryftp.model.FTPFile;

import org.hibernate.search.FullTextSession;

import org.lilystudio.veryftp.enumeration.*;

/**
 * 索引类，调用index()方法，会执行新建索引，更新索引，删除索引等逻辑
 * fullTextSession需要用spring注入
 *  
 * @author fnight
 *
 */
public class Index {
	
	private static int WORK_BATCH_SIZE=100;
	
	private TempDaoImpl dao;
	
	private FullTextSession fullTextSession;
	/**
	 * 初始化
	 */
	public void init(){
		
		fullTextSession=dao.getFullTextSession();
		
	}
	
	public void index(){
		init();              //初始化
		createIndex();		 //新建（更新）需要新建（更新）的索引
		purgeIndex();        //删除需要删除的索引	
	}
	
	/**
	 * 新建（或更新）索引（private）
	 * 
	 */
	private void createIndex(){
		
		int count=0;  //计数
		try{
			long startTime=System.currentTimeMillis();
			//开始事务
			dao.getTransaction().begin();
			dao.getFiles(IndexState.NEW);
		
			while(dao.hasNext()){
				
				count++;
				//先获得对象
				FTPFile file=dao.getFile();									
				//System.out.println(count+" :Indexing file:"+file.getFileName());
				
				//手动索引
				fullTextSession.index(file);
				//修改fileState
				file.setFileState(IndexState.DONE.toInteger());
				//刷新更新（保存到数据库）
				fullTextSession.flush();
				
				if(count%Index.WORK_BATCH_SIZE==0){	
					//清空fullTextSession里的Document对象
					fullTextSession.clear();	
					System.out.println(count+" Files Finished.");
				}			
			}
			fullTextSession.clear();
			
			//执行事务
			dao.getTransaction().commit();
			
			long endTime=System.currentTimeMillis();
			long time=endTime-startTime;
			System.out.println("Total "+count+" Files.");
			System.out.println("Total Time : "+time+" ms.");
			double per=(double)time/count;
			System.out.println(per+" ms per files.");
			
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	
	/**
	 * 删除索引（private）
	 * 
	 */
	public void purgeIndex(){
		//开始事务
		dao.getTransaction().begin();
		
		dao.getFiles(IndexState.PURGE);
		
		int count=0;  //计数
		
		while(dao.hasNext()){
			
			count++;
			
			//先获得对象
			FTPFile file=dao.getFile();
			
			fullTextSession.purge(FTPFile.class, file.getFileId());
			//修改fileState
			file.setFileState(IndexState.DONE.toInteger());
			//刷新更新（保存到数据库）
			fullTextSession.flush();
			
			//删除索引，应该是先获得Document对象，应该也需要不断的清空fullTextSession
			if(count%Index.WORK_BATCH_SIZE==0){	
				//清空fullTextSession里的Document对象
				fullTextSession.clear();					
			}
			
		}
		fullTextSession.clear();
		//执行事务
		dao.getTransaction().commit();
	}

	public TempDaoImpl getDao() {
		return dao;
	}

	public void setDao(TempDaoImpl dao) {
		this.dao = dao;
	}
}
